package com.justgame.project.base.annotation;

import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 接口访问保护注解
 * 用于规定在某一时间段内，限制IP访问次数及频率。
 * @author ZhowWeiBo
 */
@Target(value = {ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface ProtectAccess {
    /* 是否开启保护 */
    boolean enable() default true;

    /* 是否启用身份识别 */
    boolean useAuth() default false;

    /* 访问保护间隔时间值 */
    long value() default 1L;

    /* 访问保护间隔时间类型 */
    Time frequencyType() default Time.SECOND;

    @NotEmpty
    ProtectType[] type() default {ProtectType.Frequency};

    /* 拒绝访问后提示信息 */
    String message() default "请勿频繁操作！";

    /**
     * 时间类型
     */
    enum Time {
        /* 秒 */
        SECOND,
        /* 分 */
        MINUTE,
        /* 时 */
        HOUR,
        /* 天 */
        DAY
    }

    /**
     * Api保护类型
     */
    enum ProtectType {
        /* 访问频率 */
        Frequency,
        /* 访问来源：OpenFeign服务调用 */
        Feign,
    }
}
